#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/printk.h>
#include <linux/delay.h>

// 定义tasklet处理函数
void my_tasklet_handler(unsigned long data)
{
    pr_info("Tasklet is running\n");
    mdelay(5 * 1000);
    pr_info("Tasklet is end\n");
}

static DECLARE_TASKLET_OLD(my_tasklet, my_tasklet_handler);
// DECLARE_TASKLET(my_tasklet, my_tasklet_handler);

// 模块初始化函数
static int __init my_module_init(void)
{
    printk(KERN_INFO "Module initialized\n");
    tasklet_schedule(&my_tasklet);
    mdelay(200);    // 保证 tasklet 先被执行
    pr_info("module init end\n");
    return 0;
}

// 模块退出函数
static void __exit my_module_exit(void)
{
    printk(KERN_INFO "Module exited\n");
    tasklet_kill(&my_tasklet);
}

module_init(my_module_init);
module_exit(my_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("liu Jiang");
MODULE_DESCRIPTION("A simple Tasklet example");